package cn.kgc.spring.advice;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @author 课工场
 * @date 2024/2/23
 * @description  时间业务增强的通知类
 */
@Component
@Aspect
public class TimeAdvice {

// 通用切点表达式的定义
//     @Pointcut("execution(* cn.kgc.spring.service.impl.TeacherServiceImpl.*(..))")
    @Pointcut("@annotation(cn.kgc.spring.annotations.Time)")
    public void pointcut(){}

    // 前置通知
    // @Before("execution(* cn.kgc.spring.service.impl.TeacherServiceImpl.*(..))")
    public void  beforeAdvice(){
        System.out.println("上课时间到了,请开始上课");
    }


    // 后置通知   目标方法的执行没有异常的抛出
    // @AfterReturning("execution(* cn.kgc.spring.service.impl.TeacherServiceImpl.*(..))")
    public void  afterReturningAdvice(){
        System.out.println("下课时间到了,休息一下");
    }


    // 最终通知   目标方法不管是否正确执行 都执行
    // @After("execution(* cn.kgc.spring.service.impl.TeacherServiceImpl.*(..))")
    public void  afterAdvice(){
        System.out.println("最终通知");
    }


    // 异常通知
    @AfterThrowing("pointcut()")
    public void  afterThrowingAdvice(){
        System.out.println("异常通知");
    }


    // 环绕通知
    @Around("pointcut()")
    public Object  aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {

        System.out.println("环绕前通知");

        // 目标方法的执行
        Object proceed = joinPoint.proceed();


        System.out.println("环绕后通知");


        return proceed;
    }


}
